//+------------------------------------------------------------------+
//|                                                     ComboBox.h |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include "WndContainer.h"
#include "Edit.h"
#include "BmpButton.h"
#include "ListView.h"
//+------------------------------------------------------------------+
//| 资源声明：下拉按钮状态位图                                        |
//+------------------------------------------------------------------+
#resource "res\\DropOn.bmp"                 // 下拉按钮按下状态位图
#resource "res\\DropOff.bmp"                // 下拉按钮未按下状态位图
//+------------------------------------------------------------------+
//| CComboBox 类                                                      |
//| 功能：实现下拉列表控件，包含输入框、下拉按钮和列表视图               |
//+------------------------------------------------------------------+
class CComboBox : public CWndContainer
  {
private:
   // 子控件：组成下拉列表的核心元素
   CEdit             m_edit;                // 输入框（显示选中项文本）
   CBmpButton        m_drop;                // 下拉按钮（控制列表显示/隐藏）
   CListView         m_list;                // 列表视图（下拉选项列表）
   
   // 布局配置参数
   int               m_item_height;         // 列表项高度（像素）
   int               m_view_items;          // 下拉列表中可见项数量

public:
   /** 构造函数：初始化下拉列表状态 */
                     CComboBox(void);
   /** 析构函数：清理资源 */
                    ~CComboBox(void);

   //--- 创建控件
   /**
    * @brief 在图表上创建下拉列表控件
    * @param chart 目标图表ID
    * @param name 控件唯一名称
    * @param subwin 子窗口编号
    * @param x1 左上角X坐标
    * @param y1 左上角Y坐标
    * @param x2 右下角X坐标
    * @param y2 右下角Y坐标
    * @return 创建结果（true=成功）
    */
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);

   //--- 图表事件处理器
   /**
    * @brief 处理图表事件
    * @param id 事件ID
    * @param lparam 长整数参数
    * @param dparam 双精度参数
    * @param sparam 字符串参数
    * @return 事件处理结果（true=已处理）
    */
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);

   //--- 添加选项
   /**
    * @brief 向下拉列表添加一个选项
    * @param item 选项文本
    * @param value 选项关联值（默认0）
    * @return 添加结果（true=成功）
    */
   bool              AddItem(const string item,const long value=0);

   //--- 配置列表视图
   /** 设置下拉列表中可见项的数量 */
   void              ListViewItems(const int value);

   //--- 列表项管理
   /** 添加列表项 */
   virtual bool      ItemAdd(const string item,const long value=0);
   /** 在指定位置插入列表项 */
   virtual bool      ItemInsert(const int index,const string item,const long value=0);
   /** 更新指定位置的列表项 */
   virtual bool      ItemUpdate(const int index,const string item,const long value=0);
   /** 删除指定位置的列表项 */
   virtual bool      ItemDelete(const int index);
   /** 清空所有列表项 */
   virtual bool      ItemsClear(void);

   //--- 选中项操作
   /** 获取当前选中项的文本 */
   string            Select(void);
   /** 通过索引选中列表项 */
   bool              Select(const int index);
   /** 通过文本选中列表项 */
   bool              SelectByText(const string text);
   /** 通过关联值选中列表项 */
   bool              SelectByValue(const long value);

   //--- 数据读取
   /** 获取当前选中项的关联值 */
   long              Value(void);

   //--- 状态控制
   /** 显示控件 */
   virtual bool      Show(void);

   //--- 文件操作（保存/加载状态）
   /** 保存选中状态到文件 */
   virtual bool      Save(const int file_handle);
   /** 从文件加载选中状态 */
   virtual bool      Load(const int file_handle);

protected:
   //--- 子控件创建
   /** 创建输入框控件 */
   virtual bool      CreateEdit(void);
   /** 创建下拉按钮控件 */
   virtual bool      CreateButton(void);
   /** 创建列表视图控件 */
   virtual bool      CreateList(void);

   //--- 子控件事件处理
   /** 输入框点击事件处理器 */
   virtual bool      OnClickEdit(void);
   /** 下拉按钮点击事件处理器 */
   virtual bool      OnClickButton(void);
   /** 列表项变化事件处理器 */
   virtual bool      OnChangeList(void);

   //--- 列表显示控制
   /** 显示下拉列表 */
   bool              ListShow(void);
   /** 隐藏下拉列表 */
   bool              ListHide(void);
   /** 检查是否需要隐藏下拉列表（基于鼠标位置） */
   void              CheckListHide(const int id,int x,int y);
  };
//+------------------------------------------------------------------+
//| 事件映射：关联子控件事件到处理函数                                 |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CComboBox)
   ON_EVENT(ON_CLICK, m_edit,  OnClickEdit)   // 输入框点击 → 调用OnClickEdit
   ON_EVENT(ON_CLICK, m_drop,  OnClickButton) // 下拉按钮点击 → 调用OnClickButton
   ON_EVENT(ON_CHANGE,m_list,  OnChangeList)  // 列表项变化 → 调用OnChangeList
   CheckListHide(id,(int)lparam,(int)dparam); // 检查是否需要隐藏列表
EVENT_MAP_END(CWndContainer)
//+------------------------------------------------------------------+
